/*
    感觉实现xargs还挺有意思的，学到了exec函数的用法
    实现xargs首先要知道xargs是什么，简单来说，xargs就是把标准输入转换成命令行的参数放在命令行后面
    例如:echo hello too | xargs echo bye, 这里前面的输出结果hello too相当于标准输出，放在管道右边这个命令的后面，这样最终输出结果就是bye hello too
    实验要求也说了，xargs还有很多其他参数，例如-n选项指定每次处理的参数的数量，但这里仅要求参数一个一个处理即可，简化了难度

    要实现xargs，首先看一下命令行长什么样
    标准输入 | xargs echo hello world
    所以argv数组第0项是xargs，我们略过，然后将后面的内容逐个存放起来，最后把标准输入的内容拿出来放在后面，把这个处理后的结果交给子进程exec执行一下即可

    思路上还是比较简单的，代码如下:
*/
#include "kernel/types.h"
#include "user/user.h"
#include "kernel/param.h"

int main(int argc,char* argv[]){
    char* p[MAXARG]; //用p数组来存放参数
    int i;
    for(i=1;i<argc;i++)
        p[i-1]=argv[i]; //从argv[1]开始存放，因为argv[0]是xargs,数量上是argc-1,即p数组存到下标argc-2处
    p[argc-1]=malloc(512); //为p[argc-1]动态开辟512空间
    p[argc]=0; //设为0表示停止的意思，c语言只能用这种方法喽
    while(gets(p[argc-1],512)){
        if(p[argc-1][0]==0) break; //读完了
        if(p[argc-1][strlen(p[argc-1])-1]=='\n') //换行符改为0
            p[argc-1][strlen(p[argc-1])-1]=0;
        if(fork()==0)
            exec(argv[1],p); //子进程执行exec，第一个参数是执行的命令，第二个参数是命令所需的参数
        else
            wait(0); //父进程等待

        /*
            用父子进程的方式，父进程负责命令处理，子进程负责执行，这样可以让父进程能同时“发布”多个命令，提高并行效率
        */
    }
    exit(0);
}

